home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 81 / IOPROG_81.ISO / tips / Delphi / ComboBox multicolonna / UnitComboPluricolonna.pas < prev   
Encoding:
Pascal/Delphi Source File  |  2004-04-28  |  7.3 KB  |  216 lines

  1. unit UnitComboPluricolonna;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, DB, ADODB;
  8.  
  9. type
  10.   TFormComboPluricolonna = class(TForm)
  11.     ConnessioneCombo: TADOConnection;
  12.     TablePersone: TADOTable;
  13.     ComboPluricolonna: TComboBox;
  14.     TablePersoneID: TAutoIncField;
  15.     TablePersoneCognome: TWideStringField;
  16.     TablePersoneNome: TWideStringField;
  17.     TablePersoneData_di_nascita: TDateTimeField;
  18.     TablePersoneLuogo_di_nascita: TWideStringField;
  19.     TablePersoneCodice_fiscale: TWideStringField;
  20.     TablePersoneAttivo: TBooleanField;
  21.     Label1: TLabel;
  22.     Label2: TLabel;
  23.     Label3: TLabel;
  24.     Data_di_nascita: TEdit;
  25.     Luogo_di_nascita: TEdit;
  26.     Codice_fiscale: TEdit;
  27.     Utente_Attivo: TLabel;
  28.     procedure FormActivate(Sender: TObject);
  29.     procedure FormCreate(Sender: TObject);
  30.     procedure ComboPluricolonnaDrawItem(Control: TWinControl;
  31.       Index: Integer; Rect: TRect; State: TOwnerDrawState);
  32.     procedure ComboPluricolonnaChange(Sender: TObject);
  33.     procedure ComboPluricolonnaKeyPress(Sender: TObject; var Key: Char);
  34.   private
  35.     { Private declarations }
  36.     OffSetColonnaCombo : Integer; // Variabile che contiene il numero in pixel
  37.                                   // dell'offset del secondo campo all'interno
  38.                                   // del canvas del ComboBox
  39.   public
  40.     { Public declarations }
  41.   end;
  42.  
  43. const
  44.   PercorsoConnessione : String = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;' +
  45.                                  'Data Source=DatiCombo.mdb;Mode=Share Deny None;' +
  46.                                  'Extended Properties=""';
  47.  
  48. var
  49.   FormComboPluricolonna: TFormComboPluricolonna;
  50.  
  51. implementation
  52.  
  53. {$R *.dfm}
  54.  
  55. procedure TFormComboPluricolonna.FormCreate(Sender: TObject);
  56. var
  57.   Width : Integer; // Dimensione massima in pixel occupata dalle stringhe di testo
  58.                    // Cognome e Nome
  59. begin
  60.  
  61.   ConnessioneCombo.ConnectionString := PercorsoConnessione;
  62.   ConnessioneCombo.Connected := true;
  63.  
  64.   TablePersone.Active := true;
  65.  
  66.   // W Φ il carattere che occupa pi∙ pixel orizzontali tra i font true-type a
  67.   // spaziatura non fissa; sapendo che il campo ha al pi∙ 20 caratteri, possiamo
  68.   // stabilire la dimensione orizzontale del controllo ComboBox aggiungendo un
  69.   // margine di 20 pixel per la banda di scorrimento verticale.
  70.   Width := ComboPluricolonna.Canvas.TextWidth('W');
  71.   ComboPluricolonna.Width := 2 * 20 * Width + 20;
  72.   ComboPluricolonna.Clear;
  73.  
  74.   OffSetColonnaCombo := 20 * Width + 5;
  75.  
  76. end;
  77.  
  78. procedure TFormComboPluricolonna.FormActivate(Sender: TObject);
  79. var
  80.   Attivo : char; // Carattere che contiene la codifica di un dato booleano:
  81.                  // 'T' = true
  82.                  // 'F' = false
  83. begin
  84.  
  85.   // Precaricamento dei dati nel controllo ComboBox
  86.   TablePersone.First;
  87.   while not TablePersone.Eof do
  88.     begin
  89.       if TablePersone.FieldByName('Attivo').AsBoolean then
  90.         Attivo := 'T'
  91.        else
  92.          Attivo := 'F';
  93.       ComboPluricolonna.Items.Add(TablePersone.Fields[1].AsString + #13 +
  94.                                   TablePersone.Fields[2].AsString + #13 +
  95.                                   IntToStr(TablePersone.Fields[0].AsInteger) + #13 +
  96.                                   Attivo);
  97.       TablePersone.Next;
  98.     end;
  99.  
  100.   Data_di_nascita.Clear;
  101.   Luogo_di_nascita.Clear;
  102.   Codice_Fiscale.Clear;
  103.   Utente_Attivo.Font.Color := clBlack;
  104.   Utente_Attivo.Caption := '';
  105.  
  106. end;
  107.  
  108. procedure TFormComboPluricolonna.ComboPluricolonnaDrawItem(
  109.   Control: TWinControl; Index: Integer; Rect: TRect;
  110.   State: TOwnerDrawState);
  111. var
  112.   S1, S2, S3, S4 : String; // Le 4 sottostringhe di cui si compone la stringa di testo
  113.                            // del combobox
  114.  
  115.   SSR1, SSR2 : String; // Le 2 sottostringhe di appoggio per il recupero dei dati
  116.  
  117.   p1, p2, p3 : Integer; // Posizione del carattere #13 (CR) all'interno della stringa
  118.                         // di testo del combobox
  119. begin
  120.   p1 := pos(#13, ComboPluricolonna.Items.Strings[Index]); // Posizione del primo #13
  121.   S1 := copy(ComboPluricolonna.Items.Strings[Index], 1, p1-1); // Recupero campo Cognome
  122.  
  123.   SSR1 := copy(ComboPluricolonna.Items.Strings[Index], p1+1, // Stringa restante che contiene
  124.                length(ComboPluricolonna.Items.Strings[Index])); // ancora i campi Nome, ID e Attivo
  125.  
  126.   p2 := pos(#13, SSR1); // Posizione del secondo #13 che separa Nome da ID
  127.   S2 := copy(SSR1, 1, p2-1); // Recupero campo Nome
  128.  
  129.   SSR2 := copy(SSR1, p2+1, length(SSR1)); // Stringa restante che contiene i campi
  130.                                           // ID e Attivo
  131.  
  132.   p3 := pos(#13, SSR2); // Posizione dell'ultimo #13
  133.   S3 := copy(SSR2, 1, p3-1); // Recupero del campo ID
  134.  
  135.   S4 := copy(SSR2, p3+1, Length(SSR2)); // Recupero del campo Attivo
  136.  
  137.   with ComboPluricolonna.Canvas  do
  138.       begin
  139.         if S4 = 'T' then
  140.           Font.Color := clBlack // colore del font predefinito
  141.          else
  142.            Font.Color := clRed; // colore del font di evidenziazione
  143.         FillRect(Rect);
  144.  
  145.         // Si scrivono i soli campi che ci interessa far vedere
  146.         TextOut(Rect.Left + 2, Rect.Top + 1, S1);
  147.         TextOut(Rect.Left + OffSetColonnaCombo, Rect.Top + 1, S2);
  148.       end;
  149. end;
  150.  
  151. procedure TFormComboPluricolonna.ComboPluricolonnaChange(Sender: TObject);
  152. var
  153.   S1, S2, S3 : String; // Le 3 sottostringhe di cui si compone la stringa di testo
  154.                        // del combobox e che ci interessano per la fase di ricerca
  155.  
  156.   SSR1, SSR2 : String; // Le 2 sottostringhe di appoggio per il recupero dei dati
  157.  
  158.   p1, p2, p3 : Integer; // Posizione del carattere #13 (CR) all'interno della stringa
  159.                         // di testo del combobox
  160.  
  161.   Index : Integer; // Indice della riga selezionata
  162.  
  163.   ID : Integer; // Campo chiave nascosto alla vista serve per ricercare il record
  164.                 // nella tabella
  165. begin
  166.  
  167.   Data_di_nascita.Clear;
  168.   Luogo_di_nascita.Clear;
  169.   Codice_Fiscale.Clear;
  170.   Utente_Attivo.Font.Color := clBlack;
  171.   Utente_Attivo.Caption := '';
  172.  
  173.   Index := ComboPluricolonna.ItemIndex;
  174.  
  175.   p1 := pos(#13, ComboPluricolonna.Items.Strings[Index]);
  176.   S1 := copy(ComboPluricolonna.Items.Strings[Index], 1, p1-1);
  177.  
  178.   SSR1 := copy(ComboPluricolonna.Items.Strings[Index], p1+1,
  179.                length(ComboPluricolonna.Items.Strings[Index]));
  180.  
  181.   p2 := pos(#13, SSR1);
  182.   S2 := copy(SSR1, 1, p2-1);
  183.  
  184.   SSR2 := copy(SSR1, p2+1, length(SSR1));
  185.  
  186.   p3 := pos(#13, SSR2);
  187.   S3 := copy(SSR2, 1, p3-1);
  188.  
  189.   // Conversione della stringa S3 nel corrispondente valore ID
  190.   ID := StrToInt(S3);
  191.  
  192.   // Ricerca del record corretto nella tabella TablePersone
  193.   if TablePersone.Locate('ID', ID, []) then
  194.     begin
  195.       Data_di_nascita.Text := DateToStr(TablePersone.Fields[3].AsDateTime);
  196.       Luogo_di_nascita.Text := TablePersone.Fields[4].AsString;
  197.       Codice_Fiscale.Text := TablePersone.Fields[5].AsString;
  198.       if TablePersone.Fields[6].AsBoolean then
  199.         Utente_Attivo.Caption := 'Uente attivo'
  200.        else
  201.          begin
  202.            Utente_Attivo.Font.Color := clRed;
  203.            Utente_Attivo.Caption := 'Utente non attivo';
  204.          end;
  205.     end;
  206. end;
  207.  
  208. procedure TFormComboPluricolonna.ComboPluricolonnaKeyPress(Sender: TObject;
  209.   var Key: Char);
  210. begin
  211.   if Key = #13 then
  212.     Data_di_nascita.SetFocus;
  213. end;
  214.  
  215. end.
  216.